#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <assert.h>
using namespace std;
typedef void(*sighandler_t)(int);
void f(const sigset_t& set)
{
    for(int i=1;i<=31;i++)
    {
        if(sigismember(&set,i)) cout<<"1";
        else cout<<"0";
    }
    cout<<endl;
}
void handler(int signo)
{
    //打印pending
    cout<<"开始执行handler"<<endl;
    sigset_t pending;
        sigemptyset(&pending); // 不是必须的
        int n = sigpending(&pending);
        assert(n == 0);
        (void)n; //保证不会出现编译是的warning

        // 2.2 打印，方便我们查看
        f(pending);
}
int main()
{
    //怎么才能看到pending的1：
    //初始化set--把2放到set--设置阻塞
    //发送信号之后调用handler，再打印pending
   
 sigset_t set,oset;
    //初始化
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,2);
sigprocmask(SIG_BLOCK,&set,&oset);
sigpending(&set);
  signal(2, handler);
  int cnt=0;
while(true)
    {
        // 2.1 先获取pending信号集
        sigset_t pending;
        sigemptyset(&pending); // 不是必须的
        int n = sigpending(&pending);
        assert(n == 0);
        (void)n; //保证不会出现编译是的warning

        // 2.2 打印，方便我们查看
        f(pending);
        // 2.3 休眠一下
        sleep(1);
         // 2.4 10s之后，恢复对所有信号的block动作
        if(cnt++ == 10)
        {
            cout << "解除对2号信号的屏蔽" << endl; //先打印
            sigprocmask(SIG_SETMASK, &oset, nullptr); //?
        }
    }
return 0;
}